Telegram Group & Telegram Channel
πŸ› οΈ Π—Π°Π΄Π°Ρ‡Π° с ΠΏΠΎΠ΄Π²ΠΎΡ…ΠΎΠΌ: ЛСнивая инициализация ΠΈ Π»ΠΎΠ²ΡƒΡˆΠΊΠ° многопоточности

УсловиС:

Π£ вас Π΅ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:


using System;
using System.Threading;

class Program
{
static Lazy<HeavyObject> _heavy = new Lazy<HeavyObject>(() =>
{
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Initializing HeavyObject...");
return new HeavyObject();
});

static void Main()
{
for (int i = 0; i < 5; i++)
{
new Thread(() =>
{
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Accessing HeavyObject...");
var obj = _heavy.Value;
}).Start();
}

Console.ReadLine();
}
}

class HeavyObject
{
public HeavyObject()
{
Thread.Sleep(1000); // эмуляция Π΄ΠΎΠ»Π³ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] HeavyObject created.");
}
}


❓ Вопрос:
Бколько Ρ€Π°Π· Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ сообщСниС Initializing HeavyObject... ΠΈ HeavyObject created.? ΠŸΠΎΡ‡Π΅ΠΌΡƒ это ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚ΡŒ Π΄Π°ΠΆΠ΅ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Ρ… .NET Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²?

πŸ” Π Π°Π·Π±ΠΎΡ€:

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд Π²Ρ‹ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ:

- `Lazy<T>` Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ **Π»Π΅Π½ΠΈΠ²ΡƒΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·** Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ доступС.
- Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ `Initializing HeavyObject...` ΠΈ конструктор `HeavyObject` ΡΡ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·.

Но! Π’ΡƒΡ‚ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ΄Π²ΠΎΡ….

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `Lazy<T>` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ **LazyThreadSafetyMode.ExecutionAndPublication**. Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ Ссли нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΊ `.Value` ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ **Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·**.

βœ… **ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄:**

- ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΈΡˆΠ΅Ρ‚ `Accessing HeavyObject...`
- Волько ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΈΡˆΠ΅Ρ‚ `Initializing HeavyObject...` ΠΈ `HeavyObject created.`
- ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ доТдутся Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄:

```
[4] Accessing HeavyObject...
[5] Accessing HeavyObject...
[6] Accessing HeavyObject...
[7] Accessing HeavyObject...
[8] Accessing HeavyObject...
[4] Initializing HeavyObject...
[4] HeavyObject created.
```

πŸŒ€ **ΠŸΠΎΠ΄Π²ΠΎΡ…, Ссли ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ:**

Если Π²Ρ‹ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΊΠΎΠ΄ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

```csharp
static Lazy<HeavyObject> _heavy = new Lazy<HeavyObject>(
() =>
{
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Initializing HeavyObject...");
return new HeavyObject();
},
LazyThreadSafetyMode.None // Π±Π΅Π· потокобСзопасности
);
```

Π’ΠΎ ΠΏΡ€ΠΈ **ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΌ** доступС ΠΊ `.Value` Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ **нСсколько ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ** (ΠΏΠΎ сути Π³ΠΎΠ½ΠΊΡƒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ:

```
[4] Accessing HeavyObject...
[5] Accessing HeavyObject...
[6] Accessing HeavyObject...
[4] Initializing HeavyObject...
[5] Initializing HeavyObject...
[6] Initializing HeavyObject...
[4] HeavyObject created.
[5] HeavyObject created.
[6] HeavyObject created.
```

Π˜Ρ‚ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ создан нСсколько Ρ€Π°Π·, Ρ‡Ρ‚ΠΎ Π»ΠΎΠΌΠ°Π΅Ρ‚ ΠΈΠ½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ "Lazy Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·".

βœ… **Π’Ρ‹Π²ΠΎΠ΄:**

β€’ По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `Lazy<T>` **потокобСзопасСн**, Π½ΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это ΠΌΠΎΠΆΠ½ΠΎ **ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ**.
β€’ ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π² .NET всСгда ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° **Ρ€Π΅ΠΆΠΈΠΌ LazyThreadSafetyMode**.
β€’ Π”Π°ΠΆΠ΅ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π²ΠΎΡ…Π°, Ссли ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎ ошибкС ΠΈΠ»ΠΈ ΠΈΠ· ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ `LazyThreadSafetyMode.None`.

πŸ’‘ **Бонус-вопрос:**
Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚, Ссли ваш factory-ΠΌΠ΅Ρ‚ΠΎΠ΄ (лямбда) выбросит ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ? Как `Lazy<T>` ΠΏΠΎΠ²Π΅Π΄Ρ‘Ρ‚ сСбя ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ доступС ΠΊ
.Value?

@csharp_ci



tg-me.com/csharp_ci/1366
Create:
Last Update:

πŸ› οΈ Π—Π°Π΄Π°Ρ‡Π° с ΠΏΠΎΠ΄Π²ΠΎΡ…ΠΎΠΌ: ЛСнивая инициализация ΠΈ Π»ΠΎΠ²ΡƒΡˆΠΊΠ° многопоточности

УсловиС:

Π£ вас Π΅ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:


using System;
using System.Threading;

class Program
{
static Lazy<HeavyObject> _heavy = new Lazy<HeavyObject>(() =>
{
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Initializing HeavyObject...");
return new HeavyObject();
});

static void Main()
{
for (int i = 0; i < 5; i++)
{
new Thread(() =>
{
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Accessing HeavyObject...");
var obj = _heavy.Value;
}).Start();
}

Console.ReadLine();
}
}

class HeavyObject
{
public HeavyObject()
{
Thread.Sleep(1000); // эмуляция Π΄ΠΎΠ»Π³ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] HeavyObject created.");
}
}


❓ Вопрос:
Бколько Ρ€Π°Π· Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ сообщСниС Initializing HeavyObject... ΠΈ HeavyObject created.? ΠŸΠΎΡ‡Π΅ΠΌΡƒ это ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚ΡŒ Π΄Π°ΠΆΠ΅ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Ρ… .NET Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²?

πŸ” Π Π°Π·Π±ΠΎΡ€:

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд Π²Ρ‹ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ:

- `Lazy<T>` Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ **Π»Π΅Π½ΠΈΠ²ΡƒΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·** Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ доступС.
- Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ `Initializing HeavyObject...` ΠΈ конструктор `HeavyObject` ΡΡ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·.

Но! Π’ΡƒΡ‚ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ΄Π²ΠΎΡ….

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `Lazy<T>` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ **LazyThreadSafetyMode.ExecutionAndPublication**. Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ Ссли нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΊ `.Value` ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ **Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·**.

βœ… **ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄:**

- ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΈΡˆΠ΅Ρ‚ `Accessing HeavyObject...`
- Волько ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΈΡˆΠ΅Ρ‚ `Initializing HeavyObject...` ΠΈ `HeavyObject created.`
- ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ доТдутся Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄:

```
[4] Accessing HeavyObject...
[5] Accessing HeavyObject...
[6] Accessing HeavyObject...
[7] Accessing HeavyObject...
[8] Accessing HeavyObject...
[4] Initializing HeavyObject...
[4] HeavyObject created.
```

πŸŒ€ **ΠŸΠΎΠ΄Π²ΠΎΡ…, Ссли ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ:**

Если Π²Ρ‹ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΊΠΎΠ΄ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

```csharp
static Lazy<HeavyObject> _heavy = new Lazy<HeavyObject>(
() =>
{
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Initializing HeavyObject...");
return new HeavyObject();
},
LazyThreadSafetyMode.None // Π±Π΅Π· потокобСзопасности
);
```

Π’ΠΎ ΠΏΡ€ΠΈ **ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΌ** доступС ΠΊ `.Value` Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ **нСсколько ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ** (ΠΏΠΎ сути Π³ΠΎΠ½ΠΊΡƒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ:

```
[4] Accessing HeavyObject...
[5] Accessing HeavyObject...
[6] Accessing HeavyObject...
[4] Initializing HeavyObject...
[5] Initializing HeavyObject...
[6] Initializing HeavyObject...
[4] HeavyObject created.
[5] HeavyObject created.
[6] HeavyObject created.
```

Π˜Ρ‚ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ создан нСсколько Ρ€Π°Π·, Ρ‡Ρ‚ΠΎ Π»ΠΎΠΌΠ°Π΅Ρ‚ ΠΈΠ½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ "Lazy Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·".

βœ… **Π’Ρ‹Π²ΠΎΠ΄:**

β€’ По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `Lazy<T>` **потокобСзопасСн**, Π½ΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это ΠΌΠΎΠΆΠ½ΠΎ **ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ**.
β€’ ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π² .NET всСгда ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° **Ρ€Π΅ΠΆΠΈΠΌ LazyThreadSafetyMode**.
β€’ Π”Π°ΠΆΠ΅ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π²ΠΎΡ…Π°, Ссли ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎ ошибкС ΠΈΠ»ΠΈ ΠΈΠ· ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ `LazyThreadSafetyMode.None`.

πŸ’‘ **Бонус-вопрос:**
Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚, Ссли ваш factory-ΠΌΠ΅Ρ‚ΠΎΠ΄ (лямбда) выбросит ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ? Как `Lazy<T>` ΠΏΠΎΠ²Π΅Π΄Ρ‘Ρ‚ сСбя ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ доступС ΠΊ
.Value?

@csharp_ci

BY C# (C Sharp) programming


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/csharp_ci/1366

View MORE
Open in Telegram


C C Sharp programming Telegram | DID YOU KNOW?

Date: |

How to Invest in Bitcoin?

Like a stock, you can buy and hold Bitcoin as an investment. You can even now do so in special retirement accounts called Bitcoin IRAs. No matter where you choose to hold your Bitcoin, people’s philosophies on how to invest it vary: Some buy and hold long term, some buy and aim to sell after a price rally, and others bet on its price decreasing. Bitcoin’s price over time has experienced big price swings, going as low as $5,165 and as high as $28,990 in 2020 alone. β€œI think in some places, people might be using Bitcoin to pay for things, but the truth is that it’s an asset that looks like it’s going to be increasing in value relatively quickly for some time,” Marquez says. β€œSo why would you sell something that’s going to be worth so much more next year than it is today? The majority of people that hold it are long-term investors.”

Export WhatsApp stickers to Telegram on iPhone

You can’t. What you can do, though, is use WhatsApp’s and Telegram’s web platforms to transfer stickers. It’s easy, but might take a while.Open WhatsApp in your browser, find a sticker you like in a chat, and right-click on it to save it as an image. The file won’t be a picture, thoughβ€”it’s a webpage and will have a .webp extension. Don’t be scared, this is the way. Repeat this step to save as many stickers as you want.Then, open Telegram in your browser and go into your Saved messages chat. Just as you’d share a file with a friend, click the Share file button on the bottom left of the chat window (it looks like a dog-eared paper), and select the .webp files you downloaded. Click Open and you’ll see your stickers in your Saved messages chat. This is now your sticker depository. To use them, forward them as you would a message from one chat to the other: by clicking or long-pressing on the sticker, and then choosing Forward.

C C Sharp programming from us


Telegram C# (C Sharp) programming
FROM USA